/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Cliente.Controller;

import Cliente.Entidade.Cliente;
import Cliente.Entidade.Consulta;
import Cliente.Model.ConsultaPaciente;
import Cliente.Model.PesquisarPaciente;
import Cliente.View.ConsultarView;
import Cliente.util.CalculaIAC;
import Cliente.util.CalculaIMC;
import Cliente.util.CalculaRCQ;
import Cliente.util.CalcularProcessor;
import Cliente.util.LimpaCampos;
import Cliente.util.OrganizarTexto;
import Cliente.util.SelecionarSexo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
/**
 *
 * @author Caio
 */
public class ConsultarPacientePresenter {

    private ConsultarView view;

    public ConsultarView getView() {
        return view;
    }
    private List<Cliente> clientes;

    public List<Cliente> getClientes() {
        return clientes;
    }
    private DefaultTableModel tableModel;
    private ListSelectionModel listModel;
    private final PesquisarPaciente consultarcliente = new PesquisarPaciente();
    private final LimpaCampos limpaCampos = new LimpaCampos();
    private final Cliente cliente = new Cliente();
    private final Consulta consulta = new Consulta();
    private final ButtonGroup grupo = new ButtonGroup();
    private CalculaRCQ calcularcq;
    private CalculaIAC calculaiac;
    private CalculaIMC calculaimc;

    public ConsultarPacientePresenter() {
        view = new ConsultarView();
        view.setVisible(true);
        grupo.add(view.getRadFeminino());
        grupo.add(view.getRadMasculino());

        final Calendar data = Calendar.getInstance();
        defineModelo();

        view.getBtnPesquisar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                atualizaTabelaNome();
            }
        });

        view.getBtnConsultar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    consultaCliente();
                    atualizaTabelaNome();
                } catch (Exception Consulta) {
                    JOptionPane.showMessageDialog(getView(), "Erro ao consultar o cliente,verifique se os campos foram preenchidos de forma correta!", "Erro", JOptionPane.ERROR_MESSAGE);
                }
               
            }
        });

        view.getBtnDataAtual().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                view.getFtfData().setValue(new java.sql.Date(data.getTime().getTime()));
            }
        });
        view.getBtnFechar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                view.dispose();
                try {
                    this.finalize();
                } catch (Throwable ex) {
                    Logger.getLogger(ConsultarPacientePresenter.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    public Integer ajustaIdade(String campoIdade) {
        int a;
        a = (int) (Double.parseDouble(campoIdade));
        return a;
    }
    
    public void setConsulta(){
        java.sql.Date data = new java.sql.Date(((java.util.Date)this.getView().getFtfData().getValue()).getTime());
        consulta.setData(data);
        consulta.setNome(this.getView().getTxtNome().getText().trim());      
    }
    
    public void ajustaConsulta(Cliente cliente,Consulta consulta){
        consulta.setIAC(cliente.getIAC());
        consulta.setIMC(cliente.getIMC());
        consulta.setRCQ(cliente.getRCQ());
    }
    
    public void Consulta(){
        setConsulta();
        ajustaConsulta(cliente, consulta);
        ConsultaPaciente consultar = new ConsultaPaciente();
        consultar.incluiConsulta(consulta);
    }

    public Cliente setClienteStatus() {
        int indice = view.getTblCliente().getSelectedRow();
        SelecionarSexo ss = new SelecionarSexo();

        cliente.setNome(this.getView().getTxtNome().getText().trim());
        cliente.setAltura(Double.parseDouble(this.getView().getTxtAltura().getText().trim()));
        cliente.setPeso(Double.parseDouble(this.getView().getTxtPeso().getText().trim()));
        cliente.setSexo(ss.SelecionaSexo(this.getView().getRadFeminino(), this.getView().getRadMasculino()));
        cliente.setQuadril(Double.parseDouble(this.getView().getTxtQuadril().getText().trim()));
        cliente.setCintura(Double.parseDouble(this.getView().getTxtCintura().getText().trim()));
        cliente.setCpf(clientes.get(indice).getCpf());
        cliente.setIdade(this.ajustaIdade(this.getView().getTxtIdade().getText().trim()));
        
        cliente.setSexo(ss.SelecionaSexo(getView().getRadFeminino(), getView().getRadMasculino()));
        OrganizarTexto organizatexto = new OrganizarTexto();
        organizatexto.trocaParaPonto(getView().getTxtAltura(), getView().getTxtCintura(), getView().getTxtIdade(), getView().getTxtPeso(), getView().getTxtQuadril());

        cliente.setAltura(Double.parseDouble(getView().getTxtAltura().getText()));
        cliente.setQuadril(Double.parseDouble(getView().getTxtCintura().getText()));
        cliente.setPeso((Double.parseDouble(getView().getTxtPeso().getText())));
        cliente.setConsultado("Sim");
        CalcularProcessor processor = new CalcularProcessor();

        processor.addCalculoHandler(new CalculaIMC());
        processor.addCalculoHandler(new CalculaIAC());
        processor.addCalculoHandler(new CalculaRCQ());
        
        processor.handleRequest(cliente);
        return cliente;
    }
    
    
    private void consultaCliente() {
                ConsultaPaciente consulta = new ConsultaPaciente();
                Cliente cliente = new Cliente();
                cliente = this.setClienteStatus();
                cliente.setId(this.getClientes().get(this.getView().getTblCliente().getSelectedRow()).getId());
                System.out.println("");
                if (consulta.consultaPaciente(this.setClienteStatus())) {    
                    Consulta();
                     JOptionPane.showMessageDialog(this.view, "Cliente consulstado com sucesso!!", "Confirmação", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(this.view, "Erro ao alterar o cliente!", "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }
        
    
    
    

    private void defineModelo() {

        tableModel = (DefaultTableModel) view.getTblCliente().getModel();
        listModel = view.getTblCliente().getSelectionModel();
        listModel.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (e.getValueIsAdjusting()) {
                    mostraDetalheCliente();
                    view.getBtnConsultar().setEnabled(true);
                }
            }
        });
    }

    private void mostraDetalheCliente() {
        if (view.getTblCliente().getSelectedRow() != -1) {
            int indice = view.getTblCliente().getSelectedRow();
            view.getTxtNome().setText(clientes.get(indice).getNome());
            view.getTxtAltura().setText(String.valueOf(clientes.get(indice).getAltura()));
            view.getTxtIdade().setText(String.valueOf(clientes.get(indice).getIdade()));
            view.getTxtPeso().setText(String.valueOf(clientes.get(indice).getPeso()));
            if (clientes.get(indice).getSexo().equals("Masculino")) {
                view.getRadMasculino().setSelected(true);
            } else {
                view.getRadFeminino().setSelected(true);
            }
            view.getTxtQuadril().setText(String.valueOf(clientes.get(indice).getQuadril()));
            view.getTxtCintura().setText(String.valueOf(clientes.get(indice).getCintura()));
        } else {
            view.getTxtNome().setText("");
            view.getTxtAltura().setText("");
            view.getTxtIdade().setText("");
            view.getTxtPeso().setText("");
            view.getRadMasculino().isSelected();
            view.getTxtQuadril().setText("");
            view.getTxtCintura().setText("");
        }
    }

    public void ModificaCampos(boolean modifica) {
        view.getTxtAltura().setEnabled(modifica);
        view.getTxtCintura().setEnabled(modifica);
        view.getTxtIdade().setEnabled(modifica);
        view.getTxtPeso().setEnabled(modifica);
        view.getTxtQuadril().setEnabled(modifica);
        view.getRadFeminino().setEnabled(modifica);
        view.getRadMasculino().setEnabled(modifica);
        view.getFtfData().setEnabled(modifica);
    }

    public void atualizaTabelaNome() {
        PesquisarPaciente consultarcliente = new PesquisarPaciente();
        tableModel = (DefaultTableModel) view.getTblCliente().getModel();
        if (view.getTxtPesquisaNome().getText().trim().equals("")) {
            clientes = consultarcliente.listarClientes();
            //log.escreverMessage("Listando todos os pacientes");
        } else {
            clientes = consultarcliente.consultaClienteNome(view.getTxtPesquisaNome().getText().trim());
        }
        int numeroLinhas = tableModel.getRowCount();
        for (int i = 0; i < numeroLinhas; i++) {
            tableModel.removeRow(0);
        }
        for (int i = 0; i < clientes.size(); i++) {
            if (clientes.get(i).getCongnsultado().equals("Sim")) {
                tableModel.insertRow(i, new Object[]{clientes.get(i).getNome(), clientes.get(i).getIMC(), clientes.get(i).getIAC(), clientes.get(i).getRCQ()});
            } else {
                tableModel.insertRow(i, new Object[]{clientes.get(i).getNome(), "Cliente ainda não consultado", "Cliente ainda não consultado", "Cliente ainda não consultado"});
            }
            ModificaCampos(true);
        }
    }

}
